package Juego;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import view.VentanaInicial;
import view.VentanaPrincipal;
import view.VentanaRedAgua;
import Controller.ControladorPrincipal;
import Excepciones.JuegoNoEncontrado;

public class Juego {

		int tamanioGrilla = 20;

	    Jugador modelo;
	    VentanaInicial ventanaInicial;
	    ControladorPrincipal controladorPpal;

	    public void iniciar() {
	    	controladorPpal = new ControladorPrincipal();
	    	inicializarModelo();
	    	controladorPpal.conocerModelo(modelo);
	    	controladorPpal.conocerJuego(this);
	    	 crearVentanaInicial();
	    }
	    
	    
	    public void crearVentanaInicial(){
	    	ventanaInicial = new VentanaInicial(controladorPpal);
	    }
 
	    public void iniciarNuevoJuego(){
	    		modelo = new Jugador();
	    		controladorPpal.conocerModelo(modelo);
		    	controladorPpal.conocerJuego(this);
		        crearVentanasPrincipales();
	    }

		private void crearVentanasPrincipales() {

			new VentanaPrincipal( modelo, controladorPpal);	        
			new VentanaRedAgua(modelo, controladorPpal);
	    }

	    private void inicializarModelo() {
	        modelo = new Jugador();
	    }
	    
	    private void inicializarModeloCargado(Jugador modelo){
	    	controladorPpal.conocerModelo(modelo);
	    	controladorPpal.conocerJuego(this);
	        crearVentanasPrincipales();
	    }
	    
	    public void guardarJuego(String nombre) throws ParserConfigurationException, TransformerException{
	    	String nombreArchivo=nombre+".xml";
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db.newDocument();
			Element modeloSerializado = modelo.serializar(doc);
			doc.appendChild(modeloSerializado);
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource source = new DOMSource(doc);
			File archivoDestino = new File("juegosGuardados",nombreArchivo);
			StreamResult result = new StreamResult(archivoDestino);
			transformer.transform(source, result);
	    }
	    
	    public void cargarJuego(String nombre) throws JuegoNoEncontrado, ParserConfigurationException, SAXException, IOException{
	    	File archivo=new File("juegosGuardados",nombre+".xml");
	    	if(!archivo.exists()){
	    		throw new JuegoNoEncontrado();
	    	}
	    	DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(archivo);
			doc.getDocumentElement().normalize();
			modelo = Jugador.hidratar(doc);
			this.inicializarModeloCargado(modelo);
	    }
	    
	}
